#include <minix/drivers.h>
#include <minix/vtreefs.h>
#include <sys/stat.h>

#ifndef OK
#define OK 0
#endif

static void tegel_init_hook() {
	struct inode* file;
	struct inode* dir;	
	
	/* maak de map as3 een map die leesbaar en navigeerbaar is */
	struct inode_stat dir_stat = {
		S_IFDIR | 0555,
		0,
		0,
		0,
		NO_DEV
	};

	/* maak het bestand t1 alleen leesbaar */
	struct inode_stat file_stat = {
		S_IFREG | 0444,
		0,
		0,
		0,
		NO_DEV
	};
	
	/* koppel de map as3 aan de root */
	dir = add_inode(get_root_inode(), "as3", NO_INDEX, &dir_stat, 0, (cbdata_t) 1);
	/* koppel het bestand t1 aan de map as3 en geef hem de identifier 2 */
	file = add_inode(dir, "t1", NO_INDEX, &file_stat, 0, (cbdata_t) 2);
}

static int tegel_read_hook(struct inode *inode, off_t offset, char **ptr, size_t *len, cbdata_t cbdata) {
	/* doe alleen iets met de data als het om ons bestand gaat (identifier op 2) */
	if ((int)cbdata == 2) {
		static char data [] = "Hello world! Group 13 was here.\n";
		/* koppel de pointer aan een plek in onze hard-coded tekst */
		*ptr = data + offset;
		/* verminder de lengte van de data als de buffer buiten het einde dreigt te komen */
		if(*len > strlen(data) - offset) {
			*len = strlen(data) - offset;
		}
	}
	return OK;
}

struct fs_hooks my_hooks = {
	tegel_init_hook,
	NULL,
	NULL,
	NULL,
	tegel_read_hook,
	NULL,
	NULL
};	

int main() {
	/* maak de root een map die leesbaar en navigeerbaar is */
	struct inode_stat root_stat = {
		S_IFDIR | 0555,
		0,
		0,
		0,
		NO_DEV
	};
	
	start_vtreefs(&my_hooks, 5, &root_stat, 0);

	return 0;
}
